我學習的Java GUI是Swing的內容
今日內容:JFrame, JLabel
用來開啟一個視窗,是整個GUI設計的核心
import javax.swing.JFrame;
// ...
JFrame frame = new JFrame();
frame.setTitle("視窗標題"); // 設置視窗標題(預設空白)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 使得關閉視窗會自動結束程式
//如果沒這行關掉視窗時還會繼續跑
//括弧內若改成JFrame.DO_NOTHING_ON_CLOSE,則按X不會有任何行為
frame.setResizable(false); // 讓視窗不能被手動拉大小(預設true)
frame.setSize(640, 640); // 設置視窗大小(單位是px)
frame.setVisible(true); // 使視窗能夠正常顯示(預設是false)
如果想要讓視窗有自己的icon(預設是java的icon)
import javax.swing.ImageIcon;
// ...
ImageIcon image = new ImageIcon("Icon照片的相對位置或絕對位置");
frame.setIconImage(image.getImage());
如果想要設置視窗背景顏色(預設是純白)
import java.awt.Color;
// ...
frame.getContentPane().setBackground(Color.blue); // Color.後面接顏色名字,會用預設的顏色
// 或是 setBackground(new Color(0, 0, 0)); 使用RGB進行調色
// 或是 setBackground(new Color(0x35F2AB)); 使用十六進制調色
除了在main裡面直接創建一個frame,我們也可以自己新增一個class,然後extends JFrame
import javax.swing.JFrame;
import javax.swing.ImageIcon;
import java.awt.Color;
public class MyFrame extends JFrame{
MyFrame(){
// 然後將上面那些設置的東西都丟進來,只是將"frame"改成"this"
this.setTitle("視窗標題");
this.setResizable(false);
// ...以此類推,在創建MyFrame的object時就完成初始化
}
}
之後將會大量使用MyFrame extends JFrame的方式,實際實作Java OOP的概念
用於展示文字或圖片的一塊區域
import javax.swing.JLabel;
JLabel label = new JLabel();
label.setText("Hello my friend"); // 設置會顯示在畫面上的文字
label.setIcon(image); // 使用ImageIcon創建的image,會顯示在畫面中
label.setHorizontalTextPosition(JLabel.LEFT);
// 設置文字與圖片的水平相對位置(LEFT, CENTER, RIGHT)
label.setVerticalTextPosition(JLabel.CENTER);
// 設置文字與圖片的垂直相對位置(TOP, CENTER, BOTTOM)
label.setIconTextGap(100); // 設置文字與圖片之間的距離(可以是負的)
label.setHorizontalAlignment(JLabel.CENTER);
// 設置文字和圖片位於視窗的水平位置(LEFT, CENTER, RIGHT),預設是LEFT
label.setVerticalAlignment(JLabel.CENTER);
// 設置文字和圖片位於視窗的垂直位置(LEFT, CENTER, RIGHT),預設是CENTER
label.setForeground(Color.green); // 設置文字顏色(用上面的Color的東西)
label.setFont(new Font("MV Boli", Font.PLAIN, 20));
// (import java.awt.Font),設置文字形狀(文字型,風格,大小)
label.setBackground(Color.black); // 設置這個label的背景顏色
label.Opaque(true); // 設成true才能在label的範圍內塗滿每個pixel
// 最後要在frame裡面加進去
frame.add(label);
然而,label會盡可能地吃畫面中的範圍,也就是無論你怎麼拉動視窗,label都會把它當成是自己的地盤,因此我們可以使用Border來顯示label吃掉的範圍
import javax.swing.BorderFactory;
import javax.swing.border.Border;
Border border = BorderFactory.createLineBorder(Color.green, 3);
// 設置邊界(顏色, 粗度)
label.setBorder(border);
現在這個label有屬於自己的border了,接下來要修改label與frame的設定對他進行限制
label.setBounds(0, 0, 250, 250);
// (x座標,y座標,寬度,高度),x=0 y=0是在視窗左上角
frame.setLayout(null); // 關閉自動布局功能,使label不會占掉整個視窗
或者也可以直接用frame的pack method
/* 可以省去以下幾行:
* label.setBounds(0, 0, 250, 250);
* frame.setSize(640, 640);
* frame.setLayout(null);
*/
// 然後只要輸入這行:
frame.pack(); // 使得"視窗大小"貼合label大小
// 不過這樣還是會因為使用者主動拉動視窗導致不完全貼合,因此可以再設定:
frame.setResizable(false);
今天是接觸Java GUI的第一天,比起之前都是在IntelliJ裡面的Run視窗執行,現在終於打開新的視窗了,感覺很新奇,也成功開啟與使用者交互的另一種方式。
今天也是快樂學習的一天,明天繼續!